// https://www.luogu.com.cn/problem/P1923

#include <iostream>
#include <vector>
using namespace std;

pair<int, int> partition(vector<int>& arr, int left, int right) {
    if (left >= right) {
        return {left, right};  // 添加边界检查
    }
    int idx = rand() % (right - left + 1) + left;  // 修正：+1 避免除零
    swap(arr[idx], arr[left]);

    const int pivot = arr[left];
    const int start = left;
    int mid = left + 1;

    while (mid <= right) {
        if (arr[mid] < pivot) {
            swap(arr[++left], arr[mid++]);
        } else if (arr[mid] > pivot) {
            swap(arr[mid], arr[right--]);
        } else {
            mid++;
        }
    }
    swap(arr[left], arr[start]);
    return {left, right};
}

int quickSelect(vector<int>& arr, int left, int right, int k) {
    if (left == right) {  // 重要：递归终止条件
        return arr[left];
    }

    pair<int, int> pr = partition(arr, left, right);
    int leftEnd = pr.first - 1;     // 小于 pivot 区间的结束位置
    int rightStart = pr.second + 1; // 大于 pivot 区间的开始位置

    if (k <= leftEnd) {
        return quickSelect(arr, left, leftEnd, k);
    }
    if (k >= rightStart) {
        return quickSelect(arr, rightStart, right, k);
    }
    return arr[pr.first];  // k 在等于区间内
}

int main() {
    int n, k;
    scanf("%d%d", &n, &k);
    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    // 题目中的 k 是从 0 开始计数的第 k 小
    int ans = quickSelect(arr, 0, n - 1, k);
    printf("%d\n", ans);

    return 0;
}